import { _decorator, Component, director, Label, Node, ProgressBar, SceneAsset, Sprite, spriteAssembler, Tween, tween } from 'cc';
import { ClientAPI } from '../src/api/client.api';
import { LocalStorageMgr } from './LocalStorageMgr';
import { NCPoint } from '../src/api/api.config.client';
import GlobalData from './GlobalData';
const { ccclass, property } = _decorator;

@ccclass('Loading')
export class Loading extends Component {

    @property(Sprite)
    private progressBar: Sprite = null;
    fakeProgress: number;
    // 将 fakeProgress 存储在一个对象中，便于 Tween 动画操作
    private progressData = { fakeProgress: 0 };
    // 用于标记场景是否加载完成
    private sceneLoaded: boolean = false;

    start() {
        ClientAPI.CloseLoading();
    }

    update(deltaTime: number) {

    }

    preloadScene(sceneName: string): void {
        if (!LocalStorageMgr.getItem(LocalStorageMgr.gameInitFinish_key)) {
            ClientAPI.Point(NCPoint.GAMEINITSTART, { userid: GlobalData.userId });
        }
        // 初始化假的进度条为0
        this.progressData.fakeProgress = 0;
        this.sceneLoaded = false; // 重置场景加载标志

        // 预加载场景
        director.preloadScene(sceneName, this.onProgress.bind(this), (err, sceneAsset: SceneAsset) => {
            if (err) {
                console.error(`Failed to load scene: ${sceneName}`, err);
                return;
            }
            // 场景加载完成，标记为已加载
            this.sceneLoaded = true;

        });
    }

    private onProgress(completedCount: number, totalCount: number): void {

    }
    private updateProgressBar(): void {
        // 更新进度条显示
        if (this.progressBar && this.progressBar.fillRange < 1) {
            this.progressBar.fillRange = this.progressData.fakeProgress;
        }
    }

    private completeLoading(sceneName): void {
        // 当Tween动画完成并且场景加载完毕后，将进度条快速填充到100%
        Tween.stopAllByTarget(this.progressData);
        tween(this.progressData)
            .to(1, { fakeProgress: 1 }, {
                onUpdate: () => {
                    this.updateProgressBar(); // 更新进度条显示
                },
                onComplete: () => {
                    // 最终完成，切换场景
                    this.scheduleOnce(() => {
                        director.loadScene(sceneName, (err) => {
                            if (err) {
                                console.error(`Failed to switch to scene: main`, err);
                            } else {
                                console.log(`Scene main loaded successfully!`);
                            }
                        });
                    }, 0.1); // 延迟切换场景
                }
            })
            .start();
    }

    public updateProgress(targetProgress: number) {
        console.log('更新loading进度条');

        Tween.stopAllByTarget(this.progressData);
        tween(this.progressData)
            .to(3, { fakeProgress: targetProgress }, {
                onUpdate: () => {
                    this.updateProgressBar();
                }
            })
            .start();
    }

    public enterGame(sceneName: string) {
        this.completeLoading(sceneName);
    }

}

